package com.speed.config;

import com.jfinal.config.Constants;
import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors;
import com.jfinal.config.JFinalConfig;
import com.jfinal.config.Plugins;
import com.jfinal.config.Routes;
import com.jfinal.ext.plugin.shiro.ShiroPlugin;
import com.jfinal.kit.PropKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.c3p0.C3p0Plugin;
import com.jfinal.plugin.redis.RedisPlugin;
import com.jfinal.render.ViewType;
import com.speed.controller.base.BaseController;
import com.speed.entity.User;
import com.speed.handle.BaseHandler;

public class BaseConfig extends JFinalConfig {

	/**
	 * 
	 * Shiro:Apache使用前，必须学习一下对应的概念，用法
	 * 
	 * Subject：即“当前操作用户”。但是，在Shiro中，Subject这一概念并不仅仅指人，也可以是第三方进程、后台帐户（Daemon
	 * Account）或其他类似事物。它仅仅意味着“当前跟软件交互的东西”。但考虑到大多数目的和用途，你可以把它认为是Shiro的“用户”概念。
	 * Subject代表了当前用户的安全操作，SecurityManager则管理所有用户的安全操作。
	 * 
	 * SecurityManager：它是Shiro框架的核心，典型的Facade模式，Shiro通过SecurityManager来管理内部组件实例，
	 * 并通过它来提供安全管理的各种服务。
	 * 
	 * Realm： Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说，当对用户执行认证（登录）和授权（访问控制）验证时，
	 * Shiro会从应用配置的Realm中查找用户及其权限信息。
	 * 从这个意义上讲，Realm实质上是一个安全相关的DAO：它封装了数据源的连接细节，并在需要时将相关数据提供给Shiro。当配置Shiro时，
	 * 你必须至少指定一个Realm，用于认证和（或）授权。配置多个Realm是可以的，但是至少需要一个。
	 * 
	 */

	private static final String CONFIG_NAME = "speed_config.txt";

	private final String jdbc_url;
	private final String jdbc_user;
	private final String jdbc_password;
	private final Boolean dev_mode;
	private final String redis_host;
	private final Integer redis_port;
	private final Integer redis_timeout;
	private ShiroPlugin shiroPlugin = null;

	public BaseConfig() {
		PropKit.use(CONFIG_NAME);
		jdbc_url = PropKit.get(Constant.JDBC_URL_KEY);
		jdbc_user = PropKit.get(Constant.JDBC_USER_KEY);
		jdbc_password = PropKit.get(Constant.JDBC_PASSWORD_KEY);
		dev_mode = PropKit.getBoolean(Constant.DEV_MODE);
		redis_host = PropKit.get(Constant.REDIS_HOST);
		redis_port = PropKit.getInt(Constant.REDIS_PORT);
		redis_timeout = PropKit.getInt(Constant.REDIS_TIMEOUT);
	}

	@Override
	public void configConstant(Constants me) {
		me.setDevMode(dev_mode);
		// 设置默认视图渲染类型
		me.setViewType(ViewType.FREE_MARKER);
	}

	@Override
	public void configHandler(Handlers handlers) {
		handlers.add(new BaseHandler());
	}

	@Override
	public void configInterceptor(Interceptors interceptors) {

	}

	@Override
	public void configPlugin(Plugins plugins) {
		if (shiroPlugin != null)
			plugins.add(shiroPlugin);
		// MyPlus myPlus = new MyPlus("111111111");
		// plugins.add(myPlus);
		RedisPlugin redisPlugin = new RedisPlugin("user", redis_host, redis_port, redis_timeout);
		plugins.add(redisPlugin);
		C3p0Plugin c3p0Plugin = new C3p0Plugin(jdbc_url, jdbc_user, jdbc_password);
		plugins.add(c3p0Plugin);
		ActiveRecordPlugin arp = new ActiveRecordPlugin(c3p0Plugin);
		plugins.add(arp);
		arp.addMapping("t_user", User.class);
	}

	@Override
	public void configRoute(Routes routes) {
		routes.add("/", BaseController.class, "/index");
		shiroPlugin = new ShiroPlugin(routes);
	}

}
